<?php

/**
 * Обработка запросов IPN.
 *
 */
class Paypal_Action_Ipn extends Kernel_Controller_Tokened
{
    /**
     * Метод обработки пользовательского запроса.
     *
     */
    public function process()
    {
        // логируем запрос в самом начале не случай, если произойдет фатальная ошибка
        $this->_log('input', $_POST);

        // ловим исключения ошибок и выводим их сообщения в ответ, т.к.
        // статус ответа всегда должен быть 200
        try {
            // запускаем фильтр проверки подлинности данных
            $this->_forward(new Paypal_Filter_Verify());
            parent::process();
            $result = 'O.K.';
        }
        catch (Kernel_Filter_Exception_Error $e) {
            $result = $e->getMessage();
        }

        Application::getResponse()
            ->header('Content-type', 'text/plain')->write($result);

        $this->_log('result', $result);
    }

    /**
     * Возвращает описание компонента, который обработает действие, полученное
     * из запроса.
     *
     * @return  mixed
     */
    protected function _getFilterToken()
    {
        return str_replace('_', '-', Application::getRequest()->post('txn_type'));
    }

    /**
     * Возвращает наименование класса компонента, который обработает запрошенное
     * действие.
     *
     * @param   string  $name
     * @return  string
     */
    protected function _getFilterClassName($name)
    {
        return 'Paypal_Ipn_' . str_camelize($name);
    }

    /**
     * Логирует операцию.
     *
     * @param   mixed   $input
     * @param   string  $result
     */
    private function _log($label, $data)
    {
        static $_date;

        if (!isset($_date))
        {
            $_date = date('Y-m-d H-i-s');
        }

        $dir = Kernel_Config::get('paypal', 'log_dir');

        if (is_string($dir))
        {
            $p = fopen(SITE_ROOT . '/' . $dir . '/' . $_date . '.txt', 'a');
            fwrite($p, $label . ': ' . var_export($data, true) . "\n");
            fclose($p);
        }
    }
}
